<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/26
 * Time: 15:45
 * 公共的model
 */
namespace app\home\model;

use think\Db;
use think\Exception;
use think\Log;
use think\Model;
use think\Session;
use wxpay\Wxpay;

class Base extends Model {

    /**
     * 登录用户的信息
     */
    protected $user_info = '';

    /**
     * 卡片状态
     */
    protected $card_status = [
        '0'=>'待测试',
        '1'=>'库存',
        '2'=>'待激活',
        '3'=>'已激活',
        '4'=>'已停卡',
        '5'=>'已销卡',
    ];

    /**
     * 卡片类型
     */
    protected $card_type = [
        '0'=>'单卡',
        '1'=>'流量池卡',
        '2'=>'单卡',   // 考虑到购物车里面设置2为单卡
    ];

    /**
     * 卡片运营商
     */
    protected $globalsimtype = [
        '0'=>'联通',
        '1'=>'移动',
        '2'=>'电信',
    ];

    /**
     * 套餐类型
     */
    protected $package_type = [
        '0'=>'月',
        '1'=>'季度',
        '2'=>'年',
    ];

    /**
     * 订单支付类型
     */
    protected $pay_type = [
        '1'=>'在线充值',
        '2'=>'平台退款',
        '3'=>'退款给用户',
        '4'=>'卡片续费',
        '5'=>'划拨卡片',
        '6'=>'分配额度',
        '7'=>'叠加包',
        '8'=>'更新套餐',
        '9'=>'加油包',
        '10'=>'超额流量',
        '11'=>'线上购卡',
        '12'=>'发送短信',
    ];

    /**
     * 订单状态
     */
    protected $order_status = [
        '1'=>'已支付',
        '2'=>'待支付',
        '3'=>'已取消',
        '4'=>'已发货',
    ];

    /**
     * 续费类型，针对月套餐的续费业务
     * 键值代表续费周期
     */
    protected $renew_type = [
        '0'=>1,
        '1'=>3,
        '2'=>6,
        '3'=>9,
        '4'=>12,
    ];

    /**
     * 三大运营商的图标
     */
    protected $icon = [
        '0'=>'/public/static/phone/images/lt.jpg',
        '1'=>'/public/static/phone/images/yd.jpg',
        '2'=>'/public/static/phone/images/dx.jpg',
    ];

    /**
     * 初始化
     */
    public function __construct()
    {
        $this->user_info = Session::get('S_USER_INFO');
    }

    /**
     * 获取指定卡片的套餐信息
     * @param int $pid 套餐id
     * @param int $user_info 当前卡片归属的直接用户信息，考虑未登录情况下的快速续费
     * @return array 卡片的套餐信息
     */
    public function getCardPackageM($pid = 0, $user_info = [])
    {
        try {
            if(!$pid){  // 直接返回
                return ['code'=>1,'msg'=>'套餐id参数错误'];
            }
            $user_info = !empty($user_info) ? $user_info : $this->user_info;    // 快速续费/登录状态下的续费的用户信息
            $agent_id = $user_info['agent_id'];
            $sql = "SELECT `id`,`operator_type`,`pkg_kind`,`agent_price`,`yunchi_price`,`total` FROM yc_pkg WHERE `id` = ".$pid." AND `aid` = ".$agent_id." AND `pkg_status` = 1 LIMIT 1";
            $result = Db::query($sql);
            if(!$result){
                return ['code'=>2,'msg'=>'不存在套餐信息'];
            }
            // 处理套餐信息
            $package['operator_type'] = $this->globalsimtype[$result[0]['operator_type']];
            $package['pkg_kind'] = $result[0]['pkg_kind'];
            $package['pkg_kind_text'] = $this->package_type[$result[0]['pkg_kind']];
            $package['pkg_price'] = $this->getPackagePrice($result[0],$user_info);
            $package['total'] = $result[0]['total'];
            if($result[0]['pkg_kind'] == '0'){   // 月套餐处理，跨月套餐默认一个周期
                $renew_type = $this->renew_type;
                foreach($renew_type as $key=>$value){
                    $package['renew_type'][$key] = ['price'=>$value*$package['pkg_price'],'cycle'=>$value];
                }
            }
            return ['code'=>0,'msg'=>'获取套餐信息成功','package'=>$package];
        } catch (Exception $e) {
            Log::write('续费获取卡片信息异常：'.$e->getMessage(),'error');
        }
    }

    /**
     * 获取当前登录用户的卡片套餐价格
     * @param array $package 套餐信息
     * @param array $user_info 卡片归属直接客户的信息
     * @return string $pkg_price 套餐真实价格
     */
    protected function getPackagePrice($package = [], $user_info = [])
    {
        try {
            $pkg_price = ($package['agent_price'] != '') ? $package['agent_price'] : $package['yunchi_price'];
            // 判断是否针对登录客户设置单独报价
            $user_price = json_decode($user_info['setpkg'],true);
            if(!$user_price){   // 没有单独设置直接返回
                return $pkg_price;
            }
            $setArr = array_column($user_price, 'pkg_price', 'id');  // id做键，pkg_price做键值
            $setId = array_column($user_price,'id');   // 只取出id组成的新数组
            if(in_array($package['id'],$setId)){   // 判断套餐id是否在设置的id数组里面
                $pkg_price = $setArr[$package['id']];
            }
            return $pkg_price;
        } catch (Exception $e) {
            Log::write('获取用户真实套餐价格异常：'.$e->getMessage(),'error');
        }
    }

    /**
     * 创建订单
     * @param string $order_money 订单金额（单位：分，包括运费）
     * @param string $order_type 订单类型
     * @param int $order_source 订单支付来源 4：账户余额
     * @param string $order_info 订单信息，json格式
     * @param string $order_status 订单状态1：已支付 2：未支付 3：已取消 4：已发货，默认2
     * @param array $order_remarks 订单备注
     * @param array $express 快递信息
     * @param array $user_info 下单用户的信息
     * @return false：创建订单失败；$order_number：订单编号
     */
    protected function createOrder($order_money = '0', $order_type = '', $order_source = 4, $order_info = '', $order_status = 2, $order_remarks = '', $express = [], $user_info = [])
    {
        try {
            $order_number = F_creat_order_number($order_type);    // 订单编号
            if(!$order_number){   // 订单创建失败
                return false;
            }
            if(empty($express)){   // 不存在快递信息
                $express = [
                    'express_name'=>'',
                    'price'=>'',
                ];
            }
            $user_info = !empty($user_info) ? $user_info : $this->user_info;
            $field = '`order_number`,`payer`,`payee`,`user_type`,`money`,`express`,`freight`,`source`,`pay_type`,`remarks`,`order_info`,`status`,`addtime`';
            $values = "'".$order_number."','".$user_info['id']."','".$user_info['agent_id']."','3','".$order_money."','".$express['express_name'];
            $values .= "','".$express['price']."','".$order_source."','".$order_type."','".$order_remarks."','".$order_info."','".$order_status."','".time()."'";
            $sql = "INSERT INTO yc_order (".$field.") VALUES (".$values.")";
            $add = Db::execute($sql);
            if(!$add){
                return false;
            }
            return $order_number;
        } catch (Exception $e) {
            Log::write('创建订单异常','error');
        }
    }
    
    /**
     * 卡片操作日志
     * @param string $iccid 卡片的iccid
     * @param string $action 操作名称
     * @param bool $bool 操作结果true：成功；false：失败,默认true
     * @return bool
     */
    public function createLog($iccid = '', $action = '', $bool = true)
    {
        try {
            $bool = $bool ? 1 : 2;   // 操作状态
            $values = "'".$iccid."','".$this->user_info['number']."','".$action."','".$bool."','".$this->user_info['id']."','3','".time()."'";
            $sql = "INSERT INTO yc_card_log (`iccid`,`operator`,`action`,`status`,`user_id`,`user_type`,`addtime`) VALUES (".$values.")";
            $log = Db::execute($sql);
            return $log ? true : false ;
        } catch (Exception $e) {
            Log::write('卡片操作日志异常：'.$e->getMessage(),'error');
        }
    }

    /**
     * 微信授权处理，获取授权用户的openID
     * @param string $redirect_url 授权成功后返回的地址
     */
    public function getAuthUserOpenid($redirect_url)
    {
        try {
            // 是否是微信打开，以及是否已经授权过
            $isWX = strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger');
            $openId = Session::get('S_WX_OPENID');
            if( $isWX !== false && $openId ) {  // 微信浏览器并且已经授权获取了用户的openID
                return false;
            }
            // 是否配置微信支付
            $user_type = 1;  // 默认总后台
            $type = 1;   // 配置类型，1：微信配置
            $get_config = $this->getAdminConfig($user_type, $type);
            $wx_config = $get_config[0]['data'];
            if(!$wx_config || $wx_config['status'] != 1){   // 没有微信公众号的相关配置/关闭配置信息
                return false;
            }
            // 微信授权
            vendor('wxpay.Wxpay');
            $wx_pay = new \wxpay\Wxpay($wx_config['app_id'],$wx_config['mch_id'],$wx_config['appsecret'],$wx_config['mch_key']);
            // 获取微信用户的openid
            $RedirectUrl = $redirect_url;
            $token_info = $wx_pay->GetOpenid($RedirectUrl);
            if(!$token_info['openid']){   // 获取用户信息失败
                return false;
            }
            Session::set('S_WX_OPENID',$token_info['openid']);
            return true;
        } catch (Exception $e) {
            Log::write('微信处理授权异常：'.$e->getMessage(),'error');
        }
    }

    /**
     * 获取平台的配置信息
     * @param int $user_type 配置用户的类型 1：总后台 2：代理商 3：直接用户
     * @param int $type 配置类型  默认1：微信支付配置
     * @param int $user_id 配置用户的id  $user_type = 1 忽略$user_id
     * @return array 配置的信息
     */
    protected function getAdminConfig($user_type = 1, $type = 1, $user_id = '')
    {
        try {
            $sql = "SELECT `data` FROM yc_admin_config WHERE `type` = ".$type." AND `user_type` = ".$user_type." AND `user_id` = ".$user_id." LIMIT 1";
            if($user_type == 1){
                $sql = "SELECT `data` FROM yc_admin_config WHERE `type` = ".$type." AND `user_type` = ".$user_type." LIMIT 1";
            }
            $config = Db::query($sql);
            if(!$config){
                return false;
            }
            foreach($config as &$value){
                $value['data'] = json_decode($value['data'],true);
            }
            return $config;
        } catch (Exception $e) {
            Log::write('获取平台配置信息异常：'.$e->getMessage(),'error');
        }
    }
    
    /**
     * 获取调起微信扫码所需的参数
     * @param string $redirect_url 调起扫码接口的页面地址
     */
    public function getScanParamB($redirect_url)
    {
        try {
            // 是否配置微信公众号的相关参数
            $user_type = 1;  // 默认总后台
            $type = 1;   // 配置类型，1：微信配置
            $get_config = $this->getAdminConfig($user_type, $type);
            $wx_config = $get_config[0]['data'];
            if(!$wx_config || $wx_config['status'] != 1){   // 没有支付配置或者配置暂时关闭
                return false;
            }
            vendor('wxpay.Wxpay');
            $wx_scan = new Wxpay($wx_config['app_id'],$wx_config['mch_id'],$wx_config['appsecret'],$wx_config['mch_key']);
            // 获取扫码参数
            $scan_param = $wx_scan->getScanParam($redirect_url);
            $scan_param['appid'] = $wx_scan->AppID;
            return $scan_param;
        } catch (Exception $e) {
            Log::write('获取微信扫码参数异常：'.$e->getMessage(),'error');
        }
    }

    /**
     * 将XML转化为数组
     * @param xml $xml xml格式的数据
     */
    function XmlToArr($xml)
    {
        try {
            libxml_disable_entity_loader(true);
            $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
            return $values;
        } catch (Exception $e) {
            Log::write('XML转数组异常：'.$e->getMessage(),'error');
        }
    }

}